﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ADODB;
using JRO;

namespace Formation_Entreprise
{
    /// <summary>
    /// La classe CompactBD est utiliser pour contenir la methode nécessaire 
    /// au compactage de la base de données utiliser actuellement par l'usager.
    /// 
    /// Par Alexander Yumashev 2004: http://www.codeproject.com/KB/database/mdbcompact_latebind.aspx
    /// </summary>
    class CompactBD
    {
        /// <summary>
        /// La methode CompactAccessDB compacte la base de données.
        /// 
        /// Il faut s'assurer de n'avoir aucune connection active sur cette base de données.
        /// </summary>
        /// <param name="connectionString">La connection de la base de données actuel.</param>
        /// <param name="filename">Nom complet du fichier de la base de donées que vous
        /// voulez compresser</param>
        public static bool CompactAccessDB(string connectionString, string filename)
        {
            object[] oParams;

            // Creation d'une instance d'un objet JET
            object objJRO = Activator.CreateInstance(Type.GetTypeFromProgID("JRO.JetEngine"));

            // Creation d'un tableau de paramètres.
            oParams = new object[]{
                connectionString,
                "Provider=Microsoft.Jet.OLEDB.4.0;Data" + 
                " Source=C:\\tempdb.mdb;Jet OLEDB:Engine Type=5"};
            try
            {
                // Invocation de la Methode CompactDatabase de l'objet JET
                objJRO.GetType().InvokeMember("CompactDatabase",
                    System.Reflection.BindingFlags.InvokeMethod,
                    null,
                    objJRO,
                    oParams);

                // La base de données est compacter alors on
                // la déplace par dessus l'ancienne
                System.IO.File.Delete(filename);
                System.IO.File.Move("C:\\tempdb.mdb", filename);
            }
            catch(Exception ex)
            {
                // On retourne faux si une erreur c'est produite
                //donc la base de données n'est pas compacter/nettoyer
                return false;
            } 

            // Nettoyage
            System.Runtime.InteropServices.Marshal.ReleaseComObject(objJRO);
            objJRO = null;

            return true; // On retourne vrai quand toutes les manipulations sont complétées
        }
    }
}
